package io.renren.common.utils;

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.UUID;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import sun.misc.BASE64Decoder;

/**
 * ftp上传下载
 * @author liupengfei
 *
 */
public class FtpUtil {  
	  
    /**  
     * Description: 向FTP服务器上传文件  
     * @param host FTP服务器hostname  
     * @param port FTP服务器端口  
     * @param username FTP登录账号  
     * @param password FTP登录密码  
     * @param basePath FTP服务器基础目录 
     * @param filePath FTP服务器文件存放路径。例如分日期存放：/2015/01/01。文件的路径为basePath+filePath 
     * @param filename 上传到FTP服务器上的文件名  
     * @param input 输入流  
     * @return 成功返回true，否则返回false  
     */    
    public static boolean uploadFile(String host, int port, String username, String password, String basePath,  
            String filePath, String filename, InputStream input) {  
        boolean result = false;  
        FTPClient ftp = new FTPClient();  
        ftp.setConnectTimeout(10000);
        ftp.setDataTimeout(20000);
        try {  
            int reply;  
            ftp.connect(host, port);// 连接FTP服务器  
            System.out.println("UPLOAD_URL:"+host);
            // 如果采用默认端口，可以使用ftp.connect(host)的方式直接连接FTP服务器  
            ftp.login(username, password);// 登录  
            //注意 如果有防火墙的话，一定要用passive模式
            ftp.enterLocalPassiveMode();
            reply = ftp.getReplyCode();  
            if (!FTPReply.isPositiveCompletion(reply)) {  
                ftp.disconnect();  
                System.out.println("FTP连接失败！");
                return result;  
            }  
            //切换到上传目录  
            if (!ftp.changeWorkingDirectory(basePath+filePath)) {  
                //如果目录不存在创建目录  
                String[] dirs = filePath.split("/");  
                String tempPath = basePath;  
                for (String dir : dirs) {  
                    if (null == dir || "".equals(dir)) continue;  
                    tempPath += "/" + dir;  
                    if (!ftp.changeWorkingDirectory(tempPath)) {  
                        if (!ftp.makeDirectory(tempPath)) {  
                        	 System.out.println("FTP创建路径失败！");
                            return result;  
                        } else {  
                            ftp.changeWorkingDirectory(tempPath);  
                        }  
                    }  
                }  
            }  
            //设置上传文件的类型为二进制类型  
            ftp.setFileType(FTP.BINARY_FILE_TYPE);  
            //上传文件  
            if (!ftp.storeFile(filename, input)) {  
            	System.out.println("FTP存储文件失败！");
                return result;  
            }  
            input.close();  
            ftp.logout();  
            result = true;  
        } catch (IOException e) {  
            e.printStackTrace();  
            return false;
        } catch (Exception e) {  
            e.printStackTrace();  
            return false;
        } finally {  
            if (ftp.isConnected()) {  
                try {  
                    ftp.disconnect();  
                } catch (IOException ioe) {  
                }  
            }  
        }  
        return result;  
    }  
      
    /**  
     * Description: 从FTP服务器下载文件  
     * @param host FTP服务器hostname  
     * @param port FTP服务器端口  
     * @param username FTP登录账号  
     * @param password FTP登录密码  
     * @param remotePath FTP服务器上的相对路径  
     * @param fileName 要下载的文件名  
     * @param localPath 下载后保存到本地的路径  
     * @return  
     */    
    public static boolean downloadFile(String host, int port, String username, String password, String remotePath,  
            String fileName, String localPath) {  
        boolean result = false;  
        FTPClient ftp = new FTPClient();  
        try {  
            int reply;  
            ftp.connect(host, port);  
            // 如果采用默认端口，可以使用ftp.connect(host)的方式直接连接FTP服务器  
            ftp.login(username, password);// 登录  
            reply = ftp.getReplyCode();  
            if (!FTPReply.isPositiveCompletion(reply)) {  
                ftp.disconnect();  
                return result;  
            }  
            ftp.changeWorkingDirectory(remotePath);// 转移到FTP服务器目录  
            FTPFile[] fs = ftp.listFiles();  
            for (FTPFile ff : fs) {  
                if (ff.getName().equals(fileName)) {  
                    File localFile = new File(localPath + "/" + ff.getName());  
  
                    OutputStream is = new FileOutputStream(localFile);  
                    ftp.retrieveFile(ff.getName(), is);  
                    is.close();  
                }  
            }  
  
            ftp.logout();  
            result = true;  
        } catch (IOException e) {  
            e.printStackTrace();  
        } finally {  
            if (ftp.isConnected()) {  
                try {  
                    ftp.disconnect();  
                } catch (IOException ioe) {  
                }  
            }  
        }  
        return result;  
    }  
    
    /**  
     * Description: 从FTP服务器删除文件  
     * @param ftpHost FTP服务器hostname  
     * @param port FTP服务器端口  
     * @param username FTP登录账号  
     * @param password FTP登录密码  
     * @param path FTP服务器上的相对路径  
     * @param fileName 要下载的文件名  
     * @return  
     */
    public static boolean deleteFileFtp(String ftpHost, int port, String username, String password, String path,  
            String fileName){  
    	 boolean result = false;  
         FTPClient ftp = new FTPClient();  
    	try {  

        	 int reply;  
             ftp.connect(ftpHost, port);  
             // 如果采用默认端口，可以使用ftp.connect(host)的方式直接连接FTP服务器  
             ftp.login(username, password);// 登录  
             reply = ftp.getReplyCode();  
             if (!FTPReply.isPositiveCompletion(reply)) {  
                 ftp.disconnect();  
                 return result;  
             } 
            try {  
            	ftp.deleteFile(path+fileName);              
            } catch (Exception e) {  
                System.out.println("删除文件失败！请检查系统FTP设置,并确认FTP服务启动");  
            }   
            result = true;
        } catch (Exception e) {  
            System.out.println("删除文件失败！");  
        }finally {  
            if (ftp.isConnected()) {  
                try {  
                    ftp.disconnect();  
                } catch (IOException ioe) {  
                }  
            }  
        }
    	
    	return result; 
    }  
    
   public static void main(String[] args) {
	   File file = new File("/Users/liupengfei/Desktop/ehlsms.sms");
	   FileInputStream in = null;
	   try {
		in = new FileInputStream(file);
		//上传的路径
		   SimpleDateFormat strFormat = new SimpleDateFormat("yyyy-MM-dd");
		   String imagePath = ""; //strFormat.format(new Date());
		   boolean result = FtpUtil.uploadFile("ytjj.gov.cn", 21,  
	               "ehlsms","EhlSmsYtjj","",
	               imagePath,"ehlsms.sms", in);  
		   System.out.println(result);
		} catch (FileNotFoundException e) {
			System.err.println("没有文件");
			e.printStackTrace();
		}
	 
   }

    /**
     * 将字符串转成图片并上传FTP,并返回存储路径
     * @param imgData
     * @return
     */
//    public static String uploadImgToFTP(String imgData) {
//        String imgUrl = "";
//        try {
//            //解析base64内容并转成图片传到FTP上
//            String ftpUrl = EBPPropertiesHandler.getProperty("FTP_URL");
//            int ftpPoint = Integer.parseInt(EBPPropertiesHandler.getProperty("FTP_POINT"));
//            String ftpPath = EBPPropertiesHandler.getProperty("FTP_PATH");
//            String ftpUserName = EBPPropertiesHandler.getProperty("FTP_USER_NAME");
//            String ftpPassword = EBPPropertiesHandler.getProperty("FTP_PASSWORD");
//            String fileDatePath = EBPUtils.getDateStr2();
//            String serverPath = EBPPropertiesHandler.getProperty("FILE_SERVER_URL");
//            String base64Image =imgData;
//            BASE64Decoder decoderBytes =  new BASE64Decoder();
//            byte[] bytes = decoderBytes.decodeBuffer(base64Image);
//            for (int j = 0; j < bytes.length; ++j) {
//                if (bytes[j] < 0) {// 调整异常数据
//                    bytes[j] += 256;
//                }
//            }
//            ByteArrayInputStream stream = new ByteArrayInputStream(bytes);
//            //文件上传到ftp服务器
//            String uuid = UUID.randomUUID().toString().replace("-", "");
//            boolean result0 = FtpUtil.uploadFile(ftpUrl,ftpPoint,ftpUserName,ftpPassword,ftpPath,fileDatePath,uuid+".png", stream);
//            System.out.println(serverPath+"/"+fileDatePath+"/"+uuid+".png上传状态:"+result0);
//            imgUrl = serverPath+"/"+fileDatePath+"/"+uuid+".png";
//        } catch (Exception e) {
//            System.out.println("----------上传FTP异常-----");
//            e.printStackTrace();
//        }
//        return imgUrl;
//    }
}  